// #include <iostream>

// using namespace std;
// int n, A, B;
// const int N = 20;
// int res = 1e9;
// int arr[N];
// bool st[N];
// void dfs(int x, int step)
// {
//     if (step >= res)
//     {
//         return;
//     }
//     if (x == B)
//     {
//         res = min(res, step);
//         return;
//     }
//     st[x] = true;
//     // 上
//     if (x + arr[x] <= n && !st[x + arr[x]])
//     {
//         st[x + arr[x]] = true;
//         dfs(x + arr[x], step + 1);
//         st[x + arr[x]] = false;
//     }
//     //下
//     if (x - arr[x] >= 1 && !st[x - arr[x]])
//     {
//         st[x - arr[x]] = true;
//         dfs(x - arr[x], step + 1);
//         st[x - arr[x]] = false;
//     }
// }
// int main()
// {
//     cin >> n >> A >> B;
//     for (int i = 1; i <= n; i++)
//     {
//         cin >> arr[i];
//     }
//     dfs(A, 0);
//     if (res ==  1e9)
//         cout << "-1" << endl;
//     else
//         cout << res << endl;
//     return 0;
// }

// 记忆化搜索
// #include <iostream>
// #include <vector>
// #include <climits> // 用于 INT_MAX

// using namespace std;

// int n, a, b;
// int minSteps = INT_MAX; // 初始化为最大值
// vector<int> arr;        // 用于存储每层楼的 K_i
// vector<int> memo;       // 用于记录已经访问过的楼层及其对应的最少按键次数

// void dfs(int floor, int steps)
// {
//     // 如果当前按键次数已经不小于 minSteps，直接返回
//     if (steps >= minSteps)
//     {
//         return;
//     }

//     // 如果当前楼层已经访问过，并且记录的按键次数不大于当前按键次数，直接返回
//     if (memo[floor] != -1 && memo[floor] <= steps)
//     {
//         return;
//     }

//     // 记录当前楼层的按键次数
//     memo[floor] = steps;

//     // 如果到达目标楼层 B，更新最少按键次数
//     if (floor == b)
//     {
//         minSteps = steps;
//         return;
//     }

//     // 计算按“上”按钮后的新楼层
//     int upFloor = floor + arr[floor];
//     if (upFloor <= n)
//     {
//         dfs(upFloor, steps + 1);
//     }

//     // 计算按“下”按钮后的新楼层
//     int downFloor = floor - arr[floor];
//     if (downFloor >= 1)
//     {
//         dfs(downFloor, steps + 1);
//     }
// }

// int main()
// {
//     ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);

//     // 读取输入
//     cin >> n >> a >> b;
//     arr.resize(n + 1);
//     memo.resize(n + 1, -1); // 初始化 memo 数组为 -1

//     for (int i = 1; i <= n; i++)
//     {
//         cin >> arr[i];
//     }

//     // 从楼层 A 开始进行 DFS
//     dfs(a, 0);

//     // 输出结果
//     if (minSteps == INT_MAX)
//     {
//         cout << -1 << endl; // 如果 minSteps 没有更新，说明无法到达目标楼层
//     }
//     else
//     {
//         cout << minSteps << endl;
//     }

//     return 0;
// }

#include <iostream>
#include <vector>
using namespace std;
int n, A, B;
int MinSteps = 1e9;
vector<int> arr;
vector<int> memo;
void dfs(int floor, int step)
{
    if (step >= MinSteps)
    {
        return;
    }
    if (memo[floor] != -1 && memo[floor] <= step)
    {
        return;
    }

    memo[floor] = step;

    if (floor == B)
    {
        MinSteps = min(MinSteps, step);
        return;
    }

    // 上
    int UpFloor = floor + arr[floor];
    if (UpFloor <= n)
    {
        dfs(UpFloor, step + 1);
    }

    int DownFloor = floor - arr[floor];
    if (DownFloor >= 1)
    {
        dfs(DownFloor, step + 1);
    }
}

int main()
{
    ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    cin >> n >> A >> B;
    arr.resize(n + 1);
    memo.resize(n + 1, -1);
    for (int i = 1; i <= n; i++)
    {
        cin >> arr[i];
    }
    dfs(A, 0);
    if (MinSteps == 1e9)
    {
        cout << "-1" << endl;
    }
    else
    {
        cout << MinSteps << endl;
    }
    return 0;
}
